home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
COMAL
/
Z-Misc Series
/
(k)zd.d64
/
txt.machine lang
< prev
next >
Wrap
Text File
|
2007-03-01
|
3KB
|
156 lines
═┴├╚╔╬┼ ╠┴╬╟╒┴╟┼ ╔╬ ├╧═┴╠ ╔╘╙┼╠╞
BY ─ICK ╦LINGENS,
─UTCH ├╧═┴╠ ╒SERS ╟ROUP
╙OMETIMES WE DO NEED MACHINE
LANGUAGE, EVEN WHEN USING THE ├╧═┴╠
CARTRIDGE. ╔N THAT CASE WE CAN PLACE
THE MACHINE CODE IN SOME EMPTY
ADDRESSES SUCH AS ╥╙232 OR TAPE
BUFFER OR IN A PACKAGE. ┬UT WHAT TO
DO, WHEN WE DO NOT KNOW THE UNUSED
SPOTS IN MEMORY OR WHEN WE NEED MORE
THAN THE AVAILABLE ROOM? ╘HE ANSWER
IS: "CREATE MORE ROOM IN ├╧═┴╠ ITSELF
BY DEFINING A STRING".
╘HE STATEMENTS:
─╔═ CODE$ ╧╞ 500
CODE$:=╙╨├$(500)
ALLOCATE A STRING BLOCK OF 2+2+500
BYTES IN WHICH WE CAN USE 500 BYTES.
╘HE FIRST TWO BYTES CONTAIN THE
DIMENSIONED LENGTH OF THE STRING; THE
SECOND TWO THE ACTUAL LENGTH OF THE
STRING. ╘HE 500 BYTES CAN BE USED TO
POKE OUR MACHINE CODE IN. ╘O DO THIS
WE NEED TO KNOW WHERE THE STRING
BLOCK IS LOCATED IN MEMORY.
╫E SHALL DESCRIBE A SMALL PACKAGE
DOING THE SAME AS IN THE FOLLOWING
PROGRAM:
─╔═ A$ ╧╞ 500
╨╥╔╬╘ STRPTR(A$)
┼╬─
//
╞╒╬├ STRPTR(╥┼╞ X$) ├╠╧╙┼─
...
╥┼╘╒╥╬ ADDRESS
┼╬─╞╒╬├ STRPTR
╘HE VARIABLE IN THE FUNCTION IS A ╥┼╞
VARIABLE, BECAUSE WE WANT TO KNOW THE
STRING BLOCK OF THE REFERENCED
VARIABLE. ╘HE STRING BLOCK OF A ╥┼╞
STRING VARIABLE HAS THE FOLLOWING
FORMAT:
(COPY1)+0 +---------+
! M ! HIGH BYTE
! ! LOW BYTE
+---------+
(COPY1)+2 ! N ! HIGH BYTE
! ! LOW BYTE
+---------+
(COPY1)+4 ! X$(1:1) !
+---------+
! X$(2:2) !
+---------+
. .
. .
+---------+
+4+N-1 !X$(N:N) !
+---------+
IN WHICH
═: THE MAXIMUM STRING LENGTH
(DIMENSIONED LENGTH)
╬: ACTUAL STRING LENGTH
├╧╨┘1: A VECTOR TO THE STRING BLOCK.
╬OW FOLLOWS THE PACKAGE DESCRIPTION.
* = $8009
;
; CONSTANTS, VARIABLES, ROUTINES
;
FUNC = 227
ENDFNC = 126
REAL = 0
STR = 2
REF = 117
DEFPAG = %01000110
COPY1 = $0045
FNDPAR = $C896
PSHINT = $C9DE
DUMMY = $CA2F
;
; MODULE DESCRIPTION
;
.BYT DEFPAG
.WOR LEND
.WOR DUMMY
.BYT 2,'ML' ; PACKAGE NAME
.WOR PROCT ; TABLE
.WOR DUMMY
.BYT 0
PROCT .BYT 6,'STRPTR'
.WOR HSTR ; HEADER
.BYT 0
HSTR .BYT FUNC+REAL,<PTR,>PTR,1
.BYT REF+STR
.BYT ENDFUNC
;
PTR LDA #1 ; .A:=1
JSR FNDPAR ; COPY1:=ADDRESS
CLC
LDA COPY1 ; .A:=LO ADDRESS
ADC #4 ; .A:+4
TAX ; .X:=.A
LDA COPY1+1 ; .A:=HI ADDRESS
ADC #0
;
; NOW .X=LO ADDRESS
; .A=HI ADDRESS
; PUSH ADDRESS ON ├╧═┴╠ STACK
;
JSR PSHINT
RTS ; RETURN TO ├╧═┴╠
LEND .END ; END OF MODULE
╫E CAN USE THE PACKAGE STORED IN THE
FILE 'OBJ.MCCOMAL' AFTER
╠╔╬╦ "OBJ.MCCOMAL'
IN THE (INCOMPLETE) PROGRAM:
╒╙┼ ML
SETUP'ML
EXECUTE(ADDRESS)
//
╨╥╧├ SETUP'ML
─╔═ CODE$ ╧╞ 500
CODE$:=╙╨├$(500)
ADDRESS:=STRPTR(CODE$)
LOC:=ADDRESS
╫╚╔╠┼ ╬╧╘ ┼╧─ ─╧
╥┼┴─ BYTE
╨╧╦┼ LOC, BYTE
LOC:+1
┼╬─╫╚╔╠┼
// MACHINE CODE FOLLOWS
─┴╘┴ ...
─┴╘┴ ...
┼╬─╨╥╧├ SETUP'ML
//
╨╥╧├ EXECUTE(ADDR)
╙┘╙ ADDR
┼╬─╨╥╧├ EXECUTE'ML